<?php
/**
 * Datenbankconnector
 *
 * @author		Joachim Ruf
 * @copyright	Copyright (c) 2003-2010 Loresoft Software (http://www.loresoft.de)
 * @license		http://yapary.loresoft.de/lizenzbedingungen     New BSD License
 *
 * */


class Yapary_Db_Sql_Connector Implements Yapary_Db_IConnector
{
    private $serverName   = NULL;
    private $databaseName = NULL;
    private $userName     = NULL;

    private $connection   = NULL;
    private $exception    = NULL;
    private $lastQuery    = '';


    function __construct ($_serverName, $_databaseName, $_userName, $_userPassword) {
        $this->exception = new Yapary_Exception_Exception();

		$this->serverName   = $_serverName;
		$this->databaseName = $_databaseName;
		$this->userName     = $_userName;

		if (!$this->connection = @mysql_connect($this->serverName, $this->userName, $_userPassword)) {
		    $this->exception->add('Error while connecting to database server '.mysql_errno());
		}

		$this->connect();
    }


    /**
     * Liefert die MYSQL-Connect
     * @return MYSQL_Connect
     * */
    public function getSqlConnect () {
        return $this->connection;
    }


    function __destruct () {
		if (!@mysql_close($this->connection)) {
		    $this->exception->add('Error while disconnecting database '.mysql_errno());
		}
    }


	/**
	 * Stellt die Verbindung zur entspr. Datenbanktabelle her
	 * @return void
	 * */
	private function connect ()
	{
    	if (!@mysql_select_db($this->databaseName, $this->connection)) {
		    $this->exception->add('Error while connecting to database table '.mysql_errno());
    	}
	}


	/**
	 * Erstellt eine SQL-Anfrage, bei welcher die Variablen extra uebergeben werden (koennen)
	 * (fuer Query doppelte Anfuehrungszeichen benutzen!)
	 * und gegen SQL-Injection abgesichert werden
	 * @param string $_strQuery : SQL-Query
	 * @param array $arrVar  : Array aller Parameter welche ausgetauscht werden sollen im Format :variable:
     * @return Yapary_Db_IResult|NULL
	 * */
    public function request ($_strQuery, $_arrVar = array()) {
		if (count($_arrVar) >= 1) {
			while (list($key,$val) = each($_arrVar)) {
				if (strpos($_strQuery, $key) !== false) {
					$_strQuery = str_replace(':'.$key, "'".mysql_real_escape_string($val)."'", $_strQuery); // @TODO Variablen muessen unterschiedlich benannt sein
				}
			}
		}

		return $this->query($_strQuery);
    }


    /**
	 * Erstellt eine SQL-Anfrage (fuer Query doppelte Anfuehrungszeichen benutzen!)
     * Nur verwenden, falls die uebergebenen Variablen sicher sind.
     * Ansonsten request() verwenden um Variablen abzusichern
     * @param string $_strQuery : SQL-Query-String
     * @return Yapary_Db_IResult|NULL
     * */
    public function query ($_strQuery) {
		$this->connect();
        $this->lastQuery = $_strQuery;

		$resId = @mysql_query($_strQuery, $this->connection);
		$errCode = mysql_errno();
		$errMsg  = mysql_error();

		if (mysql_errno() != 0) {
            $this->exception->add('Database query not possible: '.'('.mysql_errno().') '.mysql_error());
            //return NULL;
		} else if (gettype($resId) !== 'resource' && $resId == false) {
		    //return NULL;
            $this->exception->add('Database query result is not a resource: '.'('.mysql_errno().') '.mysql_error());
		}

		return new Yapary_Db_Sql_Result($this->connection, $resId, $_strQuery, array('errCode' => $errCode, 'errMsg' => $errMsg));
    }


    /**
     * Gibt eine Instanz der Transaction-Klasse aus
     * @return Yapary_Db_ITransaction
     * */
    public function transaction () {
        return new Yapary_Db_Sql_Transaction($this->connection);
    }


    /**
     * Gibt eine Instanz der Datenbank-Klasse aus
     * @return Yapary_Db_IDatabase
     * */
    public function database () {
        return new Yapary_Db_Sql_Database($this->connection);
    }


    /**
     * Liefert die Instanz zur Exception-Klasse zurueck
     * @return Yapary_Exception_Exception
     * */
    public function exception () {
        return $this->exception;
    }


    /**
     * Liefert alle Tabellennamen aus
     * @return string
     * */
    public function getLastQuery () {
		return $this->lastQuery;
    }


}


?>